#!/usr/bin/env python
# -*- coding: utf-8 -*-

import uuid
import re
from typing import Any, Dict, List, Optional, Tuple, Union
from datetime import datetime, date

from app.core.logging import get_logger

# 创建日志记录器
logger = get_logger("utils")


def validate_collection_name(name: str) -> bool:
    """验证集合名称是否符合Milvus规范
    
    Milvus集合名称只能包含数字、字母和下划线
    
    Args:
        name: 集合名称
        
    Returns:
        bool: 是否符合规范
    """
    return bool(re.match(r'^[a-zA-Z0-9_]+$', name))


def generate_uuid() -> str:
    """生成UUID字符串
    
    生成只包含数字、字母和下划线的UUID字符串，符合Milvus集合命名规范
    
    Returns:
        str: UUID字符串
    """
    # 生成UUID并将连字符替换为下划线
    return str(uuid.uuid4()).replace("-", "_")


def format_datetime(dt: Union[datetime, date]) -> str:
    """格式化日期时间
    
    Args:
        dt: 日期时间对象
        
    Returns:
        str: 格式化的日期时间字符串
    """
    if isinstance(dt, datetime):
        return dt.strftime("%Y-%m-%d %H:%M:%S")
    return dt.strftime("%Y-%m-%d")


def parse_datetime(dt_str: str) -> datetime:
    """解析日期时间字符串
    
    Args:
        dt_str: 日期时间字符串
        
    Returns:
        datetime: 日期时间对象
        
    Raises:
        ValueError: 如果字符串格式不正确
    """
    formats = [
        "%Y-%m-%d %H:%M:%S",
        "%Y-%m-%d %H:%M",
        "%Y-%m-%d",
        "%Y/%m/%d %H:%M:%S",
        "%Y/%m/%d %H:%M",
        "%Y/%m/%d"
    ]
    
    for fmt in formats:
        try:
            return datetime.strptime(dt_str, fmt)
        except ValueError:
            continue
    
    raise ValueError(f"无法解析日期时间字符串: {dt_str}")


def sanitize_sql(sql: str) -> str:
    """清理SQL查询字符串
    
    Args:
        sql: SQL查询字符串
        
    Returns:
        str: 清理后的SQL查询字符串
    """
    # 移除多余的空白字符
    sql = re.sub(r'\s+', ' ', sql.strip())
    
    # 确保以分号结尾
    if not sql.endswith(';'):
        sql += ';'
    
    return sql


def extract_tables_from_sql(sql: str) -> List[str]:
    """从SQL查询中提取表名
    
    Args:
        sql: SQL查询字符串
        
    Returns:
        List[str]: 表名列表
    """
    # 简单的正则表达式来匹配FROM和JOIN后面的表名
    from_pattern = re.compile(r'from\s+([a-zA-Z0-9_\.]+)', re.IGNORECASE)
    join_pattern = re.compile(r'join\s+([a-zA-Z0-9_\.]+)', re.IGNORECASE)
    
    tables = []
    
    # 查找FROM子句中的表
    from_matches = from_pattern.findall(sql)
    tables.extend(from_matches)
    
    # 查找JOIN子句中的表
    join_matches = join_pattern.findall(sql)
    tables.extend(join_matches)
    
    # 移除重复项并返回
    return list(set(tables))


def model_to_dict(obj: Any) -> Dict[str, Any]:
    """将模型对象转换为字典
    
    Args:
        obj: 模型对象
        
    Returns:
        Dict[str, Any]: 字典表示
    """
    if hasattr(obj, "__dict__"):
        result = {k: v for k, v in obj.__dict__.items() if not k.startswith("_")}
        return result
    return dict(obj)